package com.powernode.client;

import com.powernode.annotation.Component;

import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class ComponentScan {
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        // 目前只知道一个包的名字,扫描这个包下所有的类,当这个类上有@Component注解的时候,实例化该对象,然后放到Map集合中。
        String packageName = "com.powernode.bean";
        // 开始写扫描程序。
        //. 这个正则表达式代表任意字符。这里的"."必须是一个普通的"."字符。不能是正则表达式中的"."
        // 在正则表达式当中怎么表示一个普通的"。“字符呢?使用\.正则表达式代表一个普通的. 字符。
        String packagePath = packageName.replaceAll("\\.", "/");
        //com是在类的根路径下的一个目录。
        URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
        // 获取一个绝对路径下的所有文件
        File file = new File(url.getPath());
        File[] listFiles = file.listFiles();
        // 遍历文件
        Arrays.stream(listFiles).forEach(f -> {
            try {
                // 获取类名
                String className = packageName + "." + f.getName().split("\\.")[0];
                // 通过反射机制解析注解，根据className获取类
                Class<?> clazz = Class.forName(className);
                // 判断是否有Component这个注解
                if (clazz.isAnnotationPresent(Component.class)) {
                    // 表示有这个注解，获取注解
                    Component annotation = clazz.getAnnotation(Component.class);
                    String id = annotation.value();
                    // 获取对象
                    Object o = clazz.newInstance();
                    map.put(id,o);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        // 输出map
        System.out.println(map);
    }
}
